	LIST	P=16F877A
	RADIX	HEX
	INCLUDE	<P16F877A.INC>

loops	equ	0x0D
loops2	equ	0x0E
conta	equ	0x35;0x0C
decenas equ     0x36
unidades equ    0x37
aux     equ     0x38
aux2    equ     0x39
anterior equ    0x40
actual   equ    0x41


reset	ORG	0x00
	goto	inicio

	ORG	0x05

retardo	movlw	D'100'
	movwf	loops

top2	movlw	D'110'
	movwf	loops2

top	nop
	nop
	nop
	nop
	nop
	nop
	decfsz	loops2,F
	goto	top
	decfsz	loops,F
	goto 	top2
	retlw	0

imprime clrf    unidades
        movf    aux2
	movwf   unidades     ;
	movwf   PORTD
        incf    aux2
	call	retardo
        goto 	pulsa

toUNI   movf    aux,W
        movwf   unidades
        goto    ciclo

toDECI  movf    aux ,W ; el valor de conta que fue almacenado en aux es ahora movido a W
        incf    decenas ; incemento decenas en 1 decenas++
        movwf   aux ; muevo el valor de w a aux
        MOVLW   0xA ; asigno un 10 decimal a W
        SUBWF   aux, W ; W= aux - w (que tiene un 10 decimal)
        
        movwf    aux ; el resultado de la resta es puesto en aux
        movf    aux ,W ; muevo aux a W
        SUBLW	0x9 ;9 decimal ,  W = 9 - conta
	btfss	STATUS,C ; C= 0 si el resultado de la resta es positivo , por ende sabemos ke aux es numero mayor que 9 o ke las unidades
	goto	toDECI ;  si aux >9 entonces lo mando a  decimales a procesar recursibamente hasta ke quede en unidades
        
        goto    toUNI ;si aux <=9 entonces lo mando a unidades directamente


procesa clrf    decenas
        clrf    unidades
        ;movlw   d'25'
        movf    conta,W
        movwf   aux ; el contenido de conta es agreagado a aux , para despues ser procesado ya sea por unidades o decenas
        SUBLW	0x09 ;9 decimal , W= 9 - conta
	btfsc	STATUS,C ; C= 0 si el resultado de la resta es positivo , por ende sabemos ke conta es numero mayor que 9 o ke las unidades
        goto    toUNI  ;si conta <=9 entonces lo mando a unidades
        ;movf    conta,W ; sino agrego conta a w y lo mando a decimales a procezar
        goto toDECI  ; si conta >9 entonces lo mando a  decimales a procesar


inicio	bsf	STATUS,RP0
        bcf     STATUS,RP1
	movlw	0x00
	movwf	TRISD
        movwf   TRISC
	movlw	0xFF
	movwf	TRISB
	bcf	STATUS,RP0
	clrf	conta
        clrf    decenas
        clrf    unidades
        clrf    anterior
        clrf    aux2
        movlw   0x01
        movwf   actual

ciclo	movf	decenas,W
	movwf	PORTC
        movf    unidades,W
        movwf   PORTD
	call	retardo

pulsa	btfss	PORTB,0 ; si el bit 0 del puertoB de entrada es 0
	goto	pulsa   ; es que el pulsador no fue presioando  y vuelve a inicar el ciclo pulsa
	call 	retardo  ; sino es ke bit 0 es igual a 1 lo que significa e el pulsador fue presiono y retardo es para ver sino fue un renote
	btfss	PORTB,0
	goto	pulsa

       
        clrf    unidades ; codigo para el finonachi 0 y 1 de la serie
        movf    aux2 , w
	movwf   PORTD
        incf    aux2
        movf    aux2, w
        sublw   .2
        BTFSc   STATUS, C
        goto    pulsa


        movf    anterior,W; inicia suma de anterior numero mas actual numero en la serie
        addwf   actual,0  ; del
	movwf   conta     ; fibonachi

        movf    actual ,W ;copiar el valor actual al anterior
        movwf   anterior
        movf    conta , W ;copiar el resultado a la variable actual
        movwf   actual
        ;incf	conta,F
        ;movlw   b'11001'
	movf	conta,W   ;el resultado del fibonachi es copiado a conta
	SUBLW	0x3F     ;63 decimal
	btfss	STATUS,C ; conta > 0x3f ?
	goto	inicio ; si inicia denuevo
	goto	procesa ; no , significa ke conta es menor o igual entonces se manda procezar para visualizarse

        END